package org.mx.service.server;

import org.springframework.beans.factory.annotation.Value;

/**
 * 描述： 抽象的HTTP服务器配置对象
 *
 * @author john peng Date time 2018/7/18 下午1:16
 */
public abstract class HttpServerConfigBean {
	@Value("${spring.rest.class.package:}")
	private String springBootClassPackage;

	private ServerType serverType = ServerType.RESTful;

	/**
	 * 构造函数
	 *
	 * @param serverType 服务器类型
	 * @see ServerType
	 */
	public HttpServerConfigBean(ServerType serverType) {
		super();
		this.serverType = serverType;
	}

	/**
	 * 获取Spring Boot启动类的包路径，可能用于后续的自动扫描。
	 *
	 * @return Spring Boot启动时由SpringBootUtils加入的变量内容
	 */
	public String getSpringBootClassPackage() {
		return springBootClassPackage;
	}

	/**
	 * 获取服务器类型
	 *
	 * @return 服务器类型
	 */
	public ServerType getServerType() {
		return serverType;
	}

	/**
	 * 获取是否启用
	 *
	 * @return 返回true表示启用，否则不启用
	 */
	public abstract boolean isEnabled();

	/**
	 * 获取监听的主机名或主机IP
	 * @return 主机名或主机IP
	 */
	public abstract String getHost();

	/**
	 * 获取监听端口号
	 *
	 * @return 端口号
	 */
	public abstract int getPort();

	/**
	 * 设置监听端口
	 * @param port 端口号
	 */
	public abstract void setPort(int port);

	/**
	 * 获取线程数量
	 *
	 * @return 线程数量
	 */
	public abstract int getThreads();

	/**
	 * 获取是否使用SSL
	 *
	 * @return 返回true表示使用SSL加密，否则不使用
	 */
	public abstract boolean isSecurity();

	/**
	 * 获取Keystore路径
	 *
	 * @return Keystore路径
	 */
	public abstract String getKeystorePath();

	/**
	 * 获取Keystore密码
	 *
	 * @return Keystore密码
	 */
	public abstract String getKeystorePassword();

	/**
	 * 获取Keystore管理员密码
	 *
	 * @return Keystore管理员密码
	 */
	public abstract String getKeyManagerPassword();

	/**
	 * 获取Keystore类型，默认为JKS
	 *
	 * @return Keystore类型
	 */
	public abstract String getKeystoreType();

	/**
	 * 获取配置的SSL ciphers
	 * @return ciphers
	 */
	public abstract String[] getCipherSuites();

	/**
	 * 获取配置的SSL protocols
	 * @return protocols
	 */
	public abstract String[] getProtocols();

	/**
	 * 获取Key别名
	 *
	 * @return 别名
	 */
	public abstract String getKeyAlias();

	/**
	 * 获取配置的Key管理工厂算法，默认为：SunX509
	 * @return 算法
	 */
	public abstract String getKeyManagerFactoryAlgorithm();

	/**
	 * 获取配置的最大证书路径长度，默认为-1，不限制
	 * @return 路径长度
	 */
	public abstract int getMaxCertPathLength();

	/**
	 * 获取配置的是否验证证书
	 * @return 设置为true需要验证证书
	 */
	public abstract boolean isValidateCerts();

	/**
	 * 获取配置的是否验证对端证书
	 * @return 设置为true需要验证对端证书
	 */
	public abstract boolean isValidatePeerCerts();

	/**
	 * 获取配置的是否需要客户端认证
	 * @return 设置为true需要客户端认证
	 */
	public abstract boolean isNeedClientAuth();

	/**
	 * 获取配置的是否期望客户端认证
	 * @return 设置为true期望客户端认证
	 */
	public abstract boolean isWantClientAuth();

	/**
	 * 获取闲置超时值
	 *
	 * @return 闲置超时值
	 */
	public abstract long getIdleTimeoutSecs();

	/**
	 * 获取输出缓冲区大小
	 *
	 * @return 缓冲区大小
	 */
	public abstract long getOutputSize();

	/**
	 * 获取请求头大小
	 *
	 * @return 请求头大小
	 */
	public abstract long getRequestHeaderSize();

	/**
	 * 获取响应头大小
	 *
	 * @return 响应头大小
	 */
	public abstract long getResponseHeaderSize();

	/**
	 * 服务器类型，支持：Web, RESTful、Servlet、WebScoket服务器。
	 */
	public enum ServerType {
		/**
		 * WEB服务
		 */
		Web,
		/**
		 * REST服务
		 */
		RESTful,
		/**
		 * Servlet服务
		 */
		Servlet,
		/**
		 * WebSocket服务
		 */
		WebSocket
	}
}
